home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 March / PCWorld_2001-03_cd.bin / Software / TemaCD / classbuild / ClassBuilder 2.2 PR405 Setup.exe / {app} / Include / CB_CriticalMulti.h < prev    next >
C/C++ Source or Header  |  2000-04-06  |  18KB  |  468 lines

  1. #ifndef CB_CRITICAL_MULTI_H
  2. #define CB_CRITICAL_MULTI_H
  3.  
  4. #include <assert.h>
  5.  
  6. #include "CB_CriticalSection.h"
  7. #include "CB_Multi.h"
  8.  
  9. #define RELATION_TEMPLATE_CRITICAL_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  10. public:\
  11.     ClassTo* _first##NameTo;\
  12.     ClassTo* _last##NameTo;\
  13.     int _count##NameTo;\
  14. \
  15.     static CriticalSection& CriticalSection##NameTo()\
  16.     {\
  17.         static CriticalSection criticalSection##NameTo;\
  18.         return criticalSection##NameTo;\
  19.     }\
  20. \
  21. public:\
  22.     void Add##NameTo##First(ClassTo* item)\
  23.     {\
  24.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  25.         METHOD_MULTI_ADDFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  26.     }\
  27.     void Add##NameTo##Last(ClassTo* item)\
  28.     {\
  29.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  30.         METHOD_MULTI_ADDLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  31.     }\
  32.     void Add##NameTo##After(ClassTo* item, ClassTo* pos)\
  33.     {\
  34.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  35.         METHOD_MULTI_ADDAFTER(ClassFrom, NameFrom, ClassTo, NameTo) \
  36.     }\
  37.     void Add##NameTo##Before(ClassTo* item, ClassTo* pos)\
  38.     {\
  39.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  40.         METHOD_MULTI_ADDBEFORE(ClassFrom, NameFrom, ClassTo, NameTo) \
  41.     }\
  42.     void Remove##NameTo(ClassTo* item)\
  43.     {\
  44.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  45.         METHOD_MULTI_REMOVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  46.     }\
  47.     void Replace##NameTo(ClassTo* item, ClassTo* newItem)\
  48.     {\
  49.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  50.         METHOD_MULTI_REPLACE(ClassFrom, NameFrom, ClassTo, NameTo) \
  51.     }\
  52.     void DeleteAll##NameTo()\
  53.     {\
  54.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  55.         METHOD_MULTI_DELETEALL(ClassFrom, NameFrom, ClassTo, NameTo) \
  56.     }\
  57.     ClassTo* GetFirst##NameTo() const\
  58.     {\
  59.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  60.         METHOD_MULTI_GETFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  61.     }\
  62.     ClassTo* GetLast##NameTo() const\
  63.     {\
  64.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  65.         METHOD_MULTI_GETLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  66.     }\
  67.     ClassTo* GetNext##NameTo(ClassTo* pos) const\
  68.     {\
  69.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  70.         METHOD_MULTI_GETNEXT(ClassFrom, NameFrom, ClassTo, NameTo) \
  71.     }\
  72.     ClassTo* GetPrev##NameTo(ClassTo* pos) const\
  73.     {\
  74.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  75.         METHOD_MULTI_GETPREV(ClassFrom, NameFrom, ClassTo, NameTo) \
  76.     }\
  77.     int Get##NameTo##Count() const\
  78.     {\
  79.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  80.         METHOD_MULTI_GETCOUNT(ClassFrom, NameFrom, ClassTo, NameTo) \
  81.     }\
  82.     void Move##NameTo##First(ClassTo* item)\
  83.     {\
  84.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  85.         METHOD_MULTI_MOVEFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  86.     }\
  87.     void Move##NameTo##Last(ClassTo* item)\
  88.     {\
  89.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  90.         METHOD_MULTI_MOVELAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  91.     }\
  92.     void Move##NameTo##After(ClassTo* item, ClassTo* pos)\
  93.     {\
  94.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  95.         METHOD_MULTI_MOVEAFTER(ClassFrom, NameFrom, ClassTo, NameTo) \
  96.     }\
  97.     void Move##NameTo##Before(ClassTo* item, ClassTo* pos)\
  98.     {\
  99.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  100.         METHOD_MULTI_MOVEBEFORE(ClassFrom, NameFrom, ClassTo, NameTo) \
  101.     }\
  102.     void Sort##NameTo(int (*comp)(ClassTo*, ClassTo*))\
  103.     {\
  104.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  105.         METHOD_MULTI_SORT(ClassFrom, NameFrom, ClassTo, NameTo) \
  106.     }\
  107.     ITERATOR_TEMPLATE_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  108.  
  109. #define RELATION_TEMPLATE_NOFILTER_CRITICAL_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  110. public:\
  111.     ClassTo* _first##NameTo;\
  112.     ClassTo* _last##NameTo;\
  113.     int _count##NameTo;\
  114. \
  115.     static CriticalSection& CriticalSection##NameTo()\
  116.     {\
  117.         static CriticalSection criticalSection##NameTo;\
  118.         return criticalSection##NameTo;\
  119.     }\
  120. \
  121. public:\
  122.     void Add##NameTo##First(ClassTo* item)\
  123.     {\
  124.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  125.         METHOD_MULTI_ADDFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  126.     }\
  127.     void Add##NameTo##Last(ClassTo* item)\
  128.     {\
  129.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  130.         METHOD_MULTI_ADDLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  131.     }\
  132.     void Add##NameTo##After(ClassTo* item, ClassTo* pos)\
  133.     {\
  134.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  135.         METHOD_MULTI_ADDAFTER(ClassFrom, NameFrom, ClassTo, NameTo) \
  136.     }\
  137.     void Add##NameTo##Before(ClassTo* item, ClassTo* pos)\
  138.     {\
  139.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  140.         METHOD_MULTI_ADDBEFORE(ClassFrom, NameFrom, ClassTo, NameTo) \
  141.     }\
  142.     void Remove##NameTo(ClassTo* item)\
  143.     {\
  144.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  145.         METHOD_MULTI_REMOVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  146.     }\
  147.     void Replace##NameTo(ClassTo* item, ClassTo* newItem)\
  148.     {\
  149.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  150.         METHOD_MULTI_REPLACE(ClassFrom, NameFrom, ClassTo, NameTo) \
  151.     }\
  152.     void DeleteAll##NameTo()\
  153.     {\
  154.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  155.         METHOD_MULTI_DELETEALL(ClassFrom, NameFrom, ClassTo, NameTo) \
  156.     }\
  157.     ClassTo* GetFirst##NameTo() const\
  158.     {\
  159.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  160.         METHOD_MULTI_GETFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  161.     }\
  162.     ClassTo* GetLast##NameTo() const\
  163.     {\
  164.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  165.         METHOD_MULTI_GETLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  166.     }\
  167.     ClassTo* GetNext##NameTo(ClassTo* pos) const\
  168.     {\
  169.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  170.         METHOD_MULTI_GETNEXT(ClassFrom, NameFrom, ClassTo, NameTo) \
  171.     }\
  172.     ClassTo* GetPrev##NameTo(ClassTo* pos) const\
  173.     {\
  174.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  175.         METHOD_MULTI_GETPREV(ClassFrom, NameFrom, ClassTo, NameTo) \
  176.     }\
  177.     int Get##NameTo##Count() const\
  178.     {\
  179.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  180.         METHOD_MULTI_GETCOUNT(ClassFrom, NameFrom, ClassTo, NameTo) \
  181.     }\
  182.     void Move##NameTo##First(ClassTo* item)\
  183.     {\
  184.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  185.         METHOD_MULTI_MOVEFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  186.     }\
  187.     void Move##NameTo##Last(ClassTo* item)\
  188.     {\
  189.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  190.         METHOD_MULTI_MOVELAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  191.     }\
  192.     void Move##NameTo##After(ClassTo* item, ClassTo* pos)\
  193.     {\
  194.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  195.         METHOD_MULTI_MOVEAFTER(ClassFrom, NameFrom, ClassTo, NameTo) \
  196.     }\
  197.     void Move##NameTo##Before(ClassTo* item, ClassTo* pos)\
  198.     {\
  199.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  200.         METHOD_MULTI_MOVEBEFORE(ClassFrom, NameFrom, ClassTo, NameTo) \
  201.     }\
  202.     void Sort##NameTo(int (*comp)(ClassTo*, ClassTo*))\
  203.     {\
  204.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  205.         METHOD_MULTI_SORT(ClassFrom, NameFrom, ClassTo, NameTo) \
  206.     }\
  207.     ITERATOR_TEMPLATE_NOFILTER_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  208.  
  209. #define RELATION_CRITICAL_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  210. public:\
  211.     ClassTo* _first##NameTo;\
  212.     ClassTo* _last##NameTo;\
  213.     int _count##NameTo;\
  214. \
  215. public:\
  216.     static CriticalSection _criticalSection##NameTo;\
  217. \
  218.     static CriticalSection& CriticalSection##NameTo() { return _criticalSection##NameTo; }\
  219. \
  220.     void Add##NameTo##First(ClassTo* item);\
  221.     void Add##NameTo##Last(ClassTo* item);\
  222.     void Add##NameTo##After(ClassTo* item, ClassTo* pos);\
  223.     void Add##NameTo##Before(ClassTo* item, ClassTo* pos);\
  224.     void Remove##NameTo(ClassTo* item);\
  225.     void RemoveAll##NameTo();\
  226.     void DeleteAll##NameTo();\
  227.     void Replace##NameTo(ClassTo* item, ClassTo* newItem);\
  228.     ClassTo* GetFirst##NameTo() const;\
  229.     ClassTo* GetLast##NameTo() const;\
  230.     ClassTo* GetNext##NameTo(ClassTo* pos) const;\
  231.     ClassTo* GetPrev##NameTo(ClassTo* pos) const;\
  232.     int Get##NameTo##Count() const;\
  233.     void Move##NameTo##First(ClassTo* item);\
  234.     void Move##NameTo##Last(ClassTo* item);\
  235.     void Move##NameTo##After(ClassTo* item, ClassTo* pos);\
  236.     void Move##NameTo##Before(ClassTo* item, ClassTo* pos);\
  237.     void Sort##NameTo(int (*comp)(ClassTo*, ClassTo*));\
  238.     ITERATOR_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  239.  
  240. #define RELATION_NOFILTER_CRITICAL_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  241. public:\
  242.     ClassTo* _first##NameTo;\
  243.     ClassTo* _last##NameTo;\
  244.     int _count##NameTo;\
  245. \
  246. public:\
  247.     static CriticalSection _criticalSection##NameTo;\
  248. \
  249.     static CriticalSection& CriticalSection##NameTo() { return _criticalSection##NameTo; }\
  250. \
  251.     void Add##NameTo##First(ClassTo* item);\
  252.     void Add##NameTo##Last(ClassTo* item);\
  253.     void Add##NameTo##After(ClassTo* item, ClassTo* pos);\
  254.     void Add##NameTo##Before(ClassTo* item, ClassTo* pos);\
  255.     void Remove##NameTo(ClassTo* item);\
  256.     void RemoveAll##NameTo();\
  257.     void DeleteAll##NameTo();\
  258.     void Replace##NameTo(ClassTo* item, ClassTo* newItem);\
  259.     ClassTo* GetFirst##NameTo() const;\
  260.     ClassTo* GetLast##NameTo() const;\
  261.     ClassTo* GetNext##NameTo(ClassTo* pos) const;\
  262.     ClassTo* GetPrev##NameTo(ClassTo* pos) const;\
  263.     int Get##NameTo##Count() const;\
  264.     void Move##NameTo##First(ClassTo* item);\
  265.     void Move##NameTo##Last(ClassTo* item);\
  266.     void Move##NameTo##After(ClassTo* item, ClassTo* pos);\
  267.     void Move##NameTo##Before(ClassTo* item, ClassTo* pos);\
  268.     void Sort##NameTo(int (*comp)(ClassTo*, ClassTo*));\
  269.     ITERATOR_NOFILTER_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  270.  
  271. #define RELATION_CRITICAL_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  272. public:\
  273.     ClassFrom* _ref##NameFrom;\
  274.     ClassTo* _prev##NameFrom;\
  275.     ClassTo* _next##NameFrom;\
  276. \
  277. public:\
  278.     ClassFrom* Get##NameFrom() const { return _ref##NameFrom; };
  279.  
  280. #define INIT_CRITICAL_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  281. {\
  282.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  283.     INIT_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  284. }
  285.  
  286. #define EXIT_CRITICAL_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  287. {\
  288.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  289.     EXIT_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  290. }
  291.  
  292. #define REPLACE_CRITICAL_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  293. {\
  294.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  295.     REPLACE_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  296. }
  297.  
  298. #define INIT_CRITICAL_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  299. {\
  300.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  301.     INIT_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  302. }
  303.  
  304. #define EXIT_CRITICAL_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  305. {\
  306.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  307.     EXIT_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  308. }
  309.  
  310. #define REPLACE_CRITICAL_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  311. {\
  312.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  313.     REPLACE_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  314. }
  315.  
  316. #define REMOVE_CRITICAL_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  317. {\
  318.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  319.     REMOVE_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  320. }
  321.  
  322. #define SAVE_CRITICAL_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  323. {\
  324.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  325.     SAVE_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  326. }
  327.  
  328. #define RESTORE_CRITICAL_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  329. {\
  330.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  331.     RESTORE_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  332. }
  333.  
  334. #define REMOVE_CRITICAL_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  335. {\
  336.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  337.     REMOVE_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  338. }
  339.  
  340. #define CLEANUP_CRITICAL_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  341. {\
  342.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  343.     CLEANUP_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  344. }
  345.  
  346. #define METHODS_CRITICAL_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  347.     CriticalSection ClassFrom##::_criticalSection##NameTo;\
  348. void ClassFrom##::Add##NameTo##First(ClassTo* item)\
  349. {\
  350.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  351.     METHOD_MULTI_ADDFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  352. }\
  353. \
  354. void ClassFrom##::Add##NameTo##Last(ClassTo* item)\
  355. {\
  356.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  357.     METHOD_MULTI_ADDLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  358. }\
  359. \
  360. void ClassFrom##::Add##NameTo##After(ClassTo* item, ClassTo* pos)\
  361. {\
  362.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  363.     METHOD_MULTI_ADDAFTER(ClassFrom, NameFrom, ClassTo, NameTo) \
  364. }\
  365. \
  366. void ClassFrom##::Add##NameTo##Before(ClassTo* item, ClassTo* pos)\
  367. {\
  368.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  369.     METHOD_MULTI_ADDBEFORE(ClassFrom, NameFrom, ClassTo, NameTo) \
  370. }\
  371. \
  372. void ClassFrom##::Remove##NameTo(ClassTo* item)\
  373. {\
  374.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  375.     METHOD_MULTI_REMOVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  376. }\
  377. \
  378. void ClassFrom##::RemoveAll##NameTo()\
  379. {\
  380.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  381.     METHOD_MULTI_REMOVEALL(ClassFrom, NameFrom, ClassTo, NameTo) \
  382. }\
  383. \
  384. void ClassFrom##::DeleteAll##NameTo()\
  385. {\
  386.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  387.     METHOD_MULTI_DELETEALL(ClassFrom, NameFrom, ClassTo, NameTo) \
  388. }\
  389. \
  390. void ClassFrom##::Replace##NameTo(ClassTo* item, ClassTo* newItem)\
  391. {\
  392.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  393.     METHOD_MULTI_REPLACE(ClassFrom, NameFrom, ClassTo, NameTo) \
  394. }\
  395. \
  396. ClassTo* ClassFrom##::GetFirst##NameTo() const\
  397. {\
  398.     METHOD_MULTI_GETFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  399. }\
  400. \
  401. ClassTo* ClassFrom##::GetLast##NameTo() const\
  402. {\
  403.     METHOD_MULTI_GETLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  404. }\
  405. \
  406. ClassTo* ClassFrom##::GetNext##NameTo(ClassTo* pos) const\
  407. {\
  408.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  409.     METHOD_MULTI_GETNEXT(ClassFrom, NameFrom, ClassTo, NameTo) \
  410. }\
  411. \
  412. ClassTo* ClassFrom##::GetPrev##NameTo(ClassTo* pos) const\
  413. {\
  414.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  415.     METHOD_MULTI_GETPREV(ClassFrom, NameFrom, ClassTo, NameTo) \
  416. }\
  417. \
  418. int ClassFrom##::Get##NameTo##Count() const\
  419. {\
  420.     METHOD_MULTI_GETCOUNT(ClassFrom, NameFrom, ClassTo, NameTo) \
  421. }\
  422. \
  423. void ClassFrom##::Move##NameTo##First(ClassTo* item)\
  424. {\
  425.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  426.     METHOD_MULTI_MOVEFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  427. }\
  428. \
  429. void ClassFrom##::Move##NameTo##Last(ClassTo* item)\
  430. {\
  431.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  432.     METHOD_MULTI_MOVELAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  433. }\
  434. \
  435. void ClassFrom##::Move##NameTo##After(ClassTo* item, ClassTo* pos)\
  436. {\
  437.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  438.     METHOD_MULTI_MOVEAFTER(ClassFrom, NameFrom, ClassTo, NameTo) \
  439. }\
  440. \
  441. void ClassFrom##::Move##NameTo##Before(ClassTo* item, ClassTo* pos)\
  442. {\
  443.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  444.     METHOD_MULTI_MOVEBEFORE(ClassFrom, NameFrom, ClassTo, NameTo) \
  445. }\
  446. \
  447. void ClassFrom##::Sort##NameTo##(int (*comp)(ClassTo*, ClassTo*))\
  448. {\
  449.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  450.     METHOD_MULTI_SORT(ClassFrom, NameFrom, ClassTo, NameTo) \
  451. }
  452.  
  453. #define METHODS_CRITICAL_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  454.  
  455. #define WRITE_CRITICAL_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  456.     {\
  457.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  458.         WRITE_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  459.     }
  460.  
  461. #define READ_CRITICAL_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  462.         {\
  463.             CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  464.             READ_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  465.         }
  466.  
  467. #endif
  468.